﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using DAL.Model;
using DAL.Persistence;
using System.Data.SqlClient;
using System.Data;

namespace DAL.Persistence
{
    /// <summary>
    /// Classe responsável pelas transações de usuários no banco de dados
    /// </summary>
    public class UsuarioDAL : DAL
    {
        /// <summary>
        /// Método para cadastrar um usuário no banco
        /// </summary>
        /// <param name="u">O usuário a ser cadastrado</param>
        /// <returns>Uma string com o status da operação</returns>
        public string Salvar(Usuario u)
        {
            try
            {
                AbrirConexao();

                comando = new SqlCommand("CadastrarUsuario", conexao);
                comando.CommandType = CommandType.StoredProcedure;

                comando.Parameters.AddWithValue("@Nome", u.Nome);
                comando.Parameters.AddWithValue("@Cpf", u.Cpf);
                comando.Parameters.AddWithValue("@Email", u.Email);
                comando.Parameters.AddWithValue("@Telefone", u.Telefone);
                comando.Parameters.AddWithValue("@TelCelular", u.TelCelular);
                comando.Parameters.AddWithValue("@Login", u.Login);
                comando.Parameters.AddWithValue("@Senha", u.Senha);
                comando.Parameters.AddWithValue("@DtCriacao", u.DtCriacao);
                comando.Parameters.AddWithValue("@DtUltAcesso", u.DtUltAcesso);
                comando.Parameters.AddWithValue("@Tipo", u.Tipo);
                comando.Parameters.AddWithValue("@FkEndereco", u.FkEndereco);

                if (comando.ExecuteNonQuery() > 0)
                    return "Usuario cadastrado com sucesso";
                else
                    throw new Exception("Erro ao cadastrar usuario");
            }
            catch (SqlException ex)
            {
                return ex.Message;
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
            finally
            {
                FecharConexao();
            }
        }

        /// <summary>
        /// Lista todos os usuários do banco de dados
        /// </summary>
        /// <returns>Retorna uma lista de objetos Usuario</returns>
        public List<Usuario> Listar()
        {
            try
            {
                AbrirConexao();

                comando = new SqlCommand("ConsultarUsuario", conexao);
                comando.CommandType = CommandType.StoredProcedure;

                dr = comando.ExecuteReader(); //Dispara a Consulta e armazena no DataReader

                List<Usuario> listaDeUsuario = new List<Usuario>();

                //percorrer o DataReader
                while (dr.Read()) //Leitura de cada registro contido no DataReader
                {
                    Usuario c = new Usuario();

                    //Ler os campos do banco para dentro do objeto Usuario
                    c.IdUsuario = Convert.ToInt32(dr["CODIGO"]);
                    c.Nome = Convert.ToString(dr["NOME"]);
                    c.Cpf = Convert.ToInt32(dr["CPF"]);
                    c.Email = Convert.ToString(dr["EMAIL"]);
                    c.Telefone = Convert.ToInt32(dr["TELEFONE"]);
                    c.TelCelular = Convert.ToInt32(dr["TELCELULAR"]);
                    c.Login = Convert.ToString(dr["LOGIN"]);
                    c.Senha = Convert.ToString(dr["SENHA"]);
                    c.DtCriacao = Convert.ToDateTime(dr["DTACESSO"]);
                    c.DtUltAcesso = Convert.ToDateTime(dr["DTULTACESSO"]);
                    c.Tipo = Convert.ToChar(dr["TIPO"]);
                    c.FkEndereco = Convert.ToInt32(dr["FKENDERECO"]);

                    listaDeUsuario.Add(c);
                }

                return listaDeUsuario;
            }
            catch
            {
                return null;
            }
            finally
            {
                FecharConexao();
            }
        }

        /// <summary>
        /// Retorna um usuario do banco de dados baseado na ID
        /// </summary>
        /// <param name="IdUsuario">O ID da usuario</param>
        /// <returns>O usuario</returns>
        public Usuario ConsultaUsuarioPorID(int IdUsuario)
        {
            try
            {
                comando = new SqlCommand("ConsultarUsuarioPorID", conexao);
                comando.CommandType = CommandType.StoredProcedure;

                dr = comando.ExecuteReader(); //Disparo a Consulta e armazeno no DataReader               

                Usuario c = null;
                //percorrer o DataReader
                while (dr.Read()) //Leitura de cada registro contido no DataReader
                {
                    c = new Usuario();

                    //Ler os campos do banco para dentro do objeto Usuario
                    c.IdUsuario = Convert.ToInt32(dr["CODIGO"]);
                    c.Nome = Convert.ToString(dr["NOME"]);
                    c.Cpf = Convert.ToInt32(dr["CPF"]);
                    c.Email = Convert.ToString(dr["EMAIL"]);
                    c.Telefone = Convert.ToInt32(dr["TELEFONE"]);
                    c.TelCelular = Convert.ToInt32(dr["TELCELULAR"]);
                    c.Login = Convert.ToString(dr["LOGIN"]);
                    c.Senha = Convert.ToString(dr["SENHA"]);
                    c.DtCriacao = Convert.ToDateTime(dr["DTACESSO"]);
                    c.DtUltAcesso = Convert.ToDateTime(dr["DTULTACESSO"]);
                    c.Tipo = Convert.ToChar(dr["TIPO"]);
                    c.FkEndereco = Convert.ToInt32(dr["FKENDERECO"]);
                }

                return c;

            }
            catch (SqlException ex)
            {
                throw ex;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                FecharConexao();
            }
        }

        /// <summary>
        /// Atualiza um usuario do banco de dados
        /// </summary>
        /// <param name="u">O usuario a ser alterado</param>
        /// <returns>Uma string com o status da operação</returns>
        public string Atualizar(Usuario u)
        {
            try
            {
                AbrirConexao();

                comando = new SqlCommand("AtualizarUsuario", conexao);
                comando.CommandType = CommandType.StoredProcedure;

                comando.Parameters.AddWithValue("@IdUsuario", u.IdUsuario);
                comando.Parameters.AddWithValue("@Nome", u.Nome);
                comando.Parameters.AddWithValue("@Cpf", u.Cpf);
                comando.Parameters.AddWithValue("@Email", u.Email);
                comando.Parameters.AddWithValue("@Telefone", u.Telefone);
                comando.Parameters.AddWithValue("@TelCelular", u.TelCelular);
                comando.Parameters.AddWithValue("@Login", u.Login);
                comando.Parameters.AddWithValue("@Senha", u.Senha);
                comando.Parameters.AddWithValue("@DtCriacao", u.DtCriacao);
                comando.Parameters.AddWithValue("@DtUltAcesso", u.DtUltAcesso);
                comando.Parameters.AddWithValue("@Tipo", u.Tipo);
                comando.Parameters.AddWithValue("@FkEndereco", u.FkEndereco);

                if (comando.ExecuteNonQuery() > 0)
                    return "Usuario atualizado com sucesso";
                else
                    throw new Exception("Erro. Usuario nao localizado");
            }
            catch (Exception e)
            {
                return e.Message;
            }
            finally
            {
                FecharConexao();
            }
        }

        /// <summary>
        /// Exclui o usuario do banco, usando o ID
        /// </summary>
        /// <param name="IdUsuario">O ID do usuario a ser excluido</param>
        /// <returns>Uma mensagem com o status da operação</returns>
        public string Excluir(int IdUsuario)
        {
            try
            {
                AbrirConexao();

                comando = new SqlCommand("ExcluirUsuario", conexao);
                comando.CommandType = CommandType.StoredProcedure;

                comando.Parameters.AddWithValue("@IdUsuario", IdUsuario);

                if (comando.ExecuteNonQuery() > 0)
                    return "Usuario excluído com sucesso";
                else
                    throw new Exception("Erro. Usuario nao localizado");
            }
            catch (Exception e)
            {
                return e.Message;
            }
            finally
            {
                FecharConexao();
            }
        }
    }
}